Amplifyで構築したAppSync(GraphQL Transformer v2)へPythonで接続する
はじめに
データアナリティクス事業本部のkobayashiです。
以前書いた記事でAmplifyで構築したAppSyncへPythonで接続するといった内容を書きました。内容としてはAmplifyを使ってフロントエンドの開発を行い、他方バックエンド用途として時間のかかる処理をPythonを使って処理するというものでした。今回、久々に同じようなアプリケーションを構築していたのですが、Amplify GraphQL Transformer v2で同じような構成にしようとした際にPythonからの接続で認証エラーが発生し、追加設定が必要だったためまとめます。
AppSyncをPythonで扱う
PythonからAppSyncへ接続する際に使うスクリプトは以前書いたエントリと同じものを使います。
今回も前回と同じGraphQLのスキーマをschema.graphql
を定義し同じPythonモジュールと同一のPythonコードを使って見たところ、Not Authorized to access UserProfile on type Mutation
のエラーが出てしまい以前のようなバックエンドのPythonを使っての接続ができませんでした。
Amplifyで構築したAppSync(v2)へPythonで接続する
同じような事例がないかを探していたところAmplify GraphQL Transformer v2では生成されるGraphQLのVTLの認証部分に変更があったためschema.graphql
のauthディレクティブの設定でIAMのAuthorization rulesを設定してもバックエンドのPythonからの認証が通らないと判明しました。
解決方法は簡単でAmplifyの公式ドキュメント(API (GraphQL) - Authorization rules - AWS Amplify Docs )にきちんと設定方法が記載されていました。これによると
schema.graphql
のauthディレクティブの設定のIAMルールはAmplifyで生成されたIAMロールのみ対象である- AppSyncで追加の認証プロバイダーとしてIAMを追加した際には許可リストを作る必要がある
ということでした。
従って、IAMロール(ユーザー)でバックエンドからPythonを使ってAppSyncに接続するためには追加設定としてその許可リストを作りamplipy push
する必要があります。
やることは単純でAmplifyのディレクトリのbackend/api/{project name}/
にcustom-roles.json
を追加し、そのファイルにアクセスを許可するIAMロール(ユーザー)のarnを追加するだけになります。
amplify/ └── backend └── api └── {project name} ├── cli-inputs.json ├── custom-roles.json <- 追加する ├── parameters.json ├── schema.graphql └── transform.conf.json
{ "adminRoleNames": [ "arn:aws:iam::1234567890:role/xxxxxxx", "arn:aws:iam::1234567890:user/yyyyyyy" ] }
以上で追加設定は完了でamplipy push
した後は前回と同じコードを実行しても今までと同じ用にAppSyncへ接続してQuery,Mutationが行えます。
注意点としては、この方法で認証を追加したIAMロール(ユーザー)にはAppSync上では管理者権限が与えられるため、schema.graphql
のauthディレクティブで行うような細かい権限設定を行うにはIAMロール(ユーザー)に付与するIAMポリシーで制限をかける必要があります。
まとめ
Amplifyで構築したAppSyncへバックエンドのPythonで接続する際の追加設定についてまとめました。
内容としてはAmplify GraphQL Transformer v2で構築したAppSyncで追加の認証プロバイダーとしてIAMを設定した場合はcustom-roles.json
ファイルに接続に使うIAMロール(ユーザー)のarnを設定する必要があるということでした。
最後まで読んで頂いてありがとうございました。